/**
 * @func 第一版记忆函数(对于对象参数不可用)
 * @param {function} f 
 * @returns {function}
 */
function memorize(f) {
    var cache = {};
    return function(){
        // 当参数是对象时，join方法自动调用toString方法 都转成 [Object object]
        var key = arguments.length + Array.prototype.join.call(arguments, ",");
        // console.log(key);
        if (key in cache) {
            return cache[key]
        }
        else return cache[key] = f.apply(this, arguments)
    }
}

var add = function(a, b, c) {
    return a + b + c
  }
  
  var memoizedAdd = memorize(add)
  
  console.time('use memorize')
  for(var i = 0; i < 100000; i++) {
      memoizedAdd(1, 2, 3)
  }
  console.timeEnd('use memorize')
  
  console.time('not use memorize')
  for(var i = 0; i < 100000; i++) {
      add(1, 2, 3)
  }
  console.timeEnd('not use memorize')


// var propValue = function(obj){
//     return obj.value
// }

// var memoizedAdd = memorize(propValue)
// //当参数是对象时
// console.log(memoizedAdd({value: 1})) // 1
// console.log(memoizedAdd({value: 2})) // 1